package com.punai.common.utils;

import cn.hutool.core.util.ObjectUtil;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.math.BigDecimal;
import java.util.List;

/**
 * 说明：StringUtil字符串处理工具类
 * @Title: StringUtil.java
 * @Package com.punai.core.util.lang
 * @See: {@link StringUtils}
 * Copyright: Copyright (c) 2016
 * Company:punai team by product
 * @author: fuyp
 * @date: 2017年6月12日 下午2:02:50
 * @version: V1.0
 */
public abstract class StringUtil extends StringUtils {
	/**
	 * 说明：声明常量log
	 */
	protected static final Logger log = LoggerFactory.getLogger(StringUtil.class);
	protected static final String UNDERLINE="_";
	/**
	 * 说明：check字符串是否超过指定范围
	 * @Title: checkStrLength
	 * @See: check字符串是否超过指定范围
	 * @author Liu Yutang
	 * @param str 字符串
	 * @param maxLen 最大长度
	 * @return
	 * @date: 2015年10月21日 上午11:49:55
	 */
	public static boolean checkStrLength(String str,int maxLen) {
		if (isNullOrEmpty(str)) {
			return false;
		}
		if (length(str) > maxLen) {
			return true;
		}
		return false;
	}
	/**
	 * 将驼峰式命名的字符串转换为下划线大写方式。如果转换前的驼峰式命名的字符串为空，则返回空字符串。</br>
	 * 例如：HelloWorld->HELLO_WORLD
	 * @param name 转换前的驼峰式命名的字符串
	 * @return 转换后下划线大写方式命名的字符串
	 */
	public static String underscoreName(String name) {
	    StringBuilder result = new StringBuilder();
	    if (name != null && name.length() > 0) {
	        // 将第一个字符处理成大写
	        result.append(name.substring(0, 1).toUpperCase());
	        // 循环处理其余字符
	        for (int i = 1; i < name.length(); i++) {
	            String s = name.substring(i, i + 1);
	            // 在大写字母前添加下划线
	            if (s.equals(s.toUpperCase()) && !Character.isDigit(s.charAt(0))) {
	                result.append(UNDERLINE);
	            }
	            // 其他字符直接转成大写
	            result.append(s.toUpperCase());
	        }
	    }
	    return result.toString();
	}
	/**
	 * 说明：判断字符串是否不为空（即不为Null、不为空）
	 *
	 * @Title: isNotNullOrEmpty
	 * @See:
	 * @author tangheng
	 * @param args
	 * @return boolean
	 * @date: 2015年4月30日 上午11:43:31
	 */
	public static boolean isNotNullOrEmpty(String args) {
		return !isNullOrEmpty(args);
	}
	/**
	 * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空，则返回空字符串。</br>
	 * 例如：HELLO_WORLD->HelloWorld
	 * @param name 转换前的下划线大写方式命名的字符串
	 * @return 转换后的驼峰式命名的字符串
	 */
	public static String camelName(String name) {
	    StringBuilder result = new StringBuilder();
	    // 快速检查
	    if (name == null || name.isEmpty()) {
	        // 没必要转换
	        return "";
	    } else if (!name.contains(UNDERLINE)) {
	        // 不含下划线，仅将首字母小写
	        return name.substring(0, 1).toLowerCase() + name.substring(1);
	    }
	    // 用下划线将原始字符串分割
	    String camels[] = name.split(UNDERLINE);
	    for (String camel :  camels) {
	        // 跳过原始字符串中开头、结尾的下换线或双重下划线
	        if (camel.isEmpty()) {
	            continue;
	        }
	        // 处理真正的驼峰片段
	        if (result.length() == 0) {
	            // 第一个驼峰片段，全部字母都小写
	            result.append(camel.toLowerCase());
	        } else {
	            // 其他的驼峰片段，首字母大写
	            result.append(camel.substring(0, 1).toUpperCase());
	            result.append(camel.substring(1).toLowerCase());
	        }
	    }
	    return result.toString();
	}

	/**
	 *
	 * 说明：截取子字符串，从开始位置到第一次出现截取标志处。（不区分大小写）
	 *
	 * @Title: substringBeforeLastIgnoreCase
	 * @See: {@link #substringBeforeLastIgnoreCase(String, String)}
	 * @author fuyp
	 * @param str
	 *            需要截取的字符串
	 * @param separator
	 *            截取的标志
	 * @return 子字符串
	 * @date: 2015年6月1日 下午3:05:20
	 */
	public static String substringBeforeLastIgnoreCase(String str, String separator) {
		if (isEmpty(str) || isEmpty(separator)) {
			return str;
		}
		String strCopy = str;
		strCopy = upperCase(strCopy);
		separator = upperCase(separator);
		final int pos = str.lastIndexOf(separator);
		if (pos == INDEX_NOT_FOUND) {
			return str;
		}
		return str.substring(0, pos);
	}

	/**
	 *
	 * 说明：从第一次出现截取的标志之后开始截取子字符串（不区分大小写）
	 *
	 * @Title: substringAfterIgnoreCase
	 * @See:
	 * @author fuyp
	 * @param str
	 *            需要截取的字符串
	 * @param separator
	 *            截取的标志
	 * @return 子字符串
	 * @date: 2015年6月1日 下午2:57:08
	 */
	public static String substringAfterIgnoreCase(String str, String separator) {
		if (isEmpty(str)) {
			return str;
		}
		String strCopy = str;
		strCopy = upperCase(strCopy);
		separator = upperCase(separator);
		if (separator == null) {
			return EMPTY;
		}
		final int pos = strCopy.indexOf(separator);
		if (pos == INDEX_NOT_FOUND) {
			return EMPTY;
		}
		return str.substring(pos + separator.length());

	}

	/**
	 * 说明：object转换成string
	 *
	 * @Title: obj2Str
	 * @See:
	 * @author tangheng
	 * @param obj
	 *            需要转换对象
	 * @return 转换后的值
	 * @date: 2015年4月22日 下午3:02:38
	 */
	public static String obj2Str(Object obj) {
		if (obj == null) {
			if (obj instanceof Number) {
				return "0";
			}
			return "";
		}
		String str = String.valueOf(obj);
		return str;
	}
	/**
	 * 说明：object转换成string
	 *
	 * @Title: obj2Str
	 * @See:
	 * @author tangheng
	 * @param obj
	 *            需要转换对象
	 * @return 转换后的值
	 * @date: 2015年4月22日 下午3:02:38
	 */
	public static String obj2Str(Object obj, String defaultValue) {
		if (obj == null) {
			return defaultValue;
		}
		String str = String.valueOf(obj);
		return str;
	}
	/**
	 * 说明：判断字符串是为空（即为Null、为空）
	 *
	 * @Title: isNullOrEmpty
	 * @See:
	 * @author tangheng
	 * @param args
	 *            参数
	 * @return boolean
	 * @date: 2015年4月30日 上午10:28:39
	 */
	public static boolean isNullOrEmpty(String args) {
		boolean isNullOrEmpty = false;
		if (null == args || 0 == args.length())
			isNullOrEmpty = true;
		return isNullOrEmpty;
	}


	public static String replaceNumToChinese(int num) {
		String resultString = "";
		switch (num) {
		case 1:
			resultString =  "一";
			break;
		case 2:
			resultString =  "二";
			break;
		case 3:
			resultString =  "三";
			break;
		case 4:
			resultString =  "四";
			break;
		case 5:
			resultString =  "五";
			break;
		case 6:
			resultString =  "六";
			break;
		case 7:
			resultString =  "日";
			break;
		default:
			break;
		}
		return resultString;
	}

	public static String getValue(Object searchKey) {
		if (ObjectUtil.isNull(searchKey))
			return null;
		if (searchKey instanceof String) {
			return (String) searchKey;
		} else if (searchKey instanceof Integer) {
			return ((Integer) searchKey) + "";
		} else if (searchKey instanceof Cell) {
			Cell cell = (Cell) searchKey;
			cell.setCellType(CellType.STRING);
			return cell.getStringCellValue();
		} else if (searchKey instanceof BigDecimal) {
			return String.valueOf(searchKey);
		} else if (searchKey instanceof Boolean) {
			return String.valueOf(searchKey);
		}
		return null;
	}

	 /**
		 * 将List<String>集合 转化为String
		 * 如{"aaa","bbb"} To 'aaa','bbb'
		 */
		public static String convertListToString(List<String> strlist){
			StringBuffer sb = new StringBuffer();
			if(CollectionUtils.isNotEmpty(strlist)){
				for (int i=0;i<strlist.size();i++) {
					if(i==0){
						sb.append("'").append(strlist.get(i)).append("'");
					}else{
						sb.append(",").append("'").append(strlist.get(i)).append("'");
					}
				}
			}
			return sb.toString();

	    }

}
